#include <bits/stdc++.h>

using namespace std;

// 最大BST子树
// 给定一个二叉树，找到其中最大的二叉搜索树（BST）子树，并返回该子树的大小
// 其中，最大指的是子树节点数最多的
// 二叉搜索树（BST）中的所有节点都具备以下属性：
// 左子树的值小于其父（根）节点的值
// 右子树的值大于其父（根）节点的值
// 注意：子树必须包含其所有后代
// LeetCode 测试链接 : https://leetcode.cn/problems/largest-bst-subtree/
// nowcoder 测试链接：https://www.nowcoder.com/questionTerminal/380d49d7f99242709ab4b91c36bf2acc
// nowcoder 需要提交全部代码，LeetCode 提交 Solution 类即可

struct TreeNode 
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

class Solution 
{
private:
    struct Info
    {
        long mx, mn; // 子树的最大值和最小值
        bool isBst; // 子树是否是 BST
        int maxBstSize; // 子树中最大 BST 的大小

        Info(long a, long b, bool c, int d)
        {
            mx = a; 
            mn = b;
            isBst = c;
            maxBstSize = d;
        }
    };

    Info f(TreeNode* x)
    {
        if(x == nullptr)
        {
            return Info(LONG_MIN, LONG_MAX, true, 0);
        }

        Info&& infol = f(x->left);
        Info&& infor = f(x->right);
        // 左 4 个信息
		// 右 4 个信息
		// x 整合出 4 个信息返回
        long mx = max((long)x->val, max(infol.mx, infor.mx));
        long mn = min((long)x->val, min(infol.mn, infor.mn));
        bool isBst = infol.isBst && infor.isBst && infol.mx < x->val && x->val < infor.mn;
        int maxBstSize;
        if(isBst) maxBstSize = infol.maxBstSize + infor.maxBstSize + 1;
        else maxBstSize = max(infol.maxBstSize, infor.maxBstSize);

        return Info(mx, mn, isBst, maxBstSize);
    }

public:
    int largestBSTSubtree(TreeNode* root) 
    {
        return f(root).maxBstSize;
    }
};

int main()
{
    int n, root;
    scanf("%d%d", &n, &root);
    TreeNode* nodes[n + 1];
    memset(nodes, 0, sizeof nodes);
    for(int i = 1, p, lc, rc; i <= n; ++i)
    {
        scanf("%d%d%d", &p, &lc, &rc);
        // 建树
        if(!nodes[p]) nodes[p] = new TreeNode(p);
        TreeNode* parent = nodes[p];
        if(lc != 0)
        {
            if(!nodes[lc]) nodes[lc] = new TreeNode(lc);
            parent->left = nodes[lc];
        }
        if(rc != 0)
        {
            if(!nodes[rc]) nodes[rc] = new TreeNode(rc);
            parent->right = nodes[rc];
        }
    }
    printf("%d\n", Solution().largestBSTSubtree(nodes[root]));

    return 0;
}